﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebShopAPI.Models;
using DAL;
using Models;
namespace WebShopAPI.Controllers
{
    /// <summary>
    /// users 用户管理模块 其实是管理员表
    /// 练习用标准的Rsuful风格写
    /// </summary>
    public class usersController : BaseWebApiController
    {
       
        sp_managerDAL userdal = new sp_managerDAL();
        sp_roleService sp_RoleService = new sp_roleService();

        #region 1 用户数据列表
        public ResponData Get(string query=null,int pagenum=1,int pagesize=10) 
        {
            try
            {
                //查询所有数据
                List<sp_manager> userAll = userdal.GetAllUser();
                //条件筛选
                if (!string.IsNullOrEmpty(query))
                {
                    userAll = userAll.Where(p => p.mg_name.Contains(query)).ToList();
                }
                //计算数据
                int totalpage = userAll.Count();//总条数
                                                //数据
                var users = userAll.OrderByDescending(p => p.mg_id)
                    .Skip((pagenum - 1) * pagesize).Take(pagesize).ToList();
                //构建对象
                ResponData rdata = new ResponData();
                rdata.data = new
                {
                    totalpage = totalpage,
                    users = users.Select(p =>
                    //响应数据尽量创建一个类才创建对象,而不采用匿名类对象
                    new
                    {
                        id = p.mg_id, //要处理属性
                        username = p.mg_name,
                        mobile = p.mg_mobile,
                        type = p.role_id, //角色id
                        email = p.mg_email,
                        create_time = p.mg_time,
                        mg_state = p.mg_state == 1 ? true : false,
                        role_name = sp_RoleService.GetOne(p.role_id).role_name

                    }),

                    pagenum = pagenum
                };
                rdata.meta.msg = "查询成功";
                rdata.meta.status = 200;//
                return rdata;
            }
            catch (Exception ex) 
            {
                ResponData rdata = new ResponData();
                rdata.meta.msg = ex.Message+ex.InnerException.StackTrace;
                rdata.meta.status = 201;
                return rdata;
            }


          
        }
        #endregion

        #region 2 添加用户
        //增加用户，由于数据库表的对象 与 要求的对象不一致，一般需要创建视图model
        //接收的对象,与数据库的实体类,不一致
        public ResponData Add(AddUserRequest userobj) 
        {
            //获取请求数据后,转成数据库对象
            sp_manager adduser = new sp_manager();
            adduser.mg_name = userobj.UserName;
            adduser.mg_pwd = userobj.Password;
            adduser.mg_email = userobj.Email;
            adduser.mg_mobile = userobj.Phone;
           
            //再加上其他数据项
            adduser.role_id = 30; //该值可以配置在外部文件,角色表中有的值
            adduser.mg_time =(int)((DateTime.Now-new DateTime(2000,1,1)).Ticks);
            adduser.mg_state = 1;//状态1为可用
            //增加
            userdal.Add(adduser);
            //响应数据构建
            //
            ResponData rdata = new ResponData();
            rdata.data = new
            {
                id = adduser.mg_id,
                username = adduser.mg_name,
                mobile = adduser.mg_mobile,
                type = adduser.role_id, //角色id
                email = adduser.mg_email,
                //以下三个属性一般建一表时都会加上记录该数据增加，修改，删除时间
                create_time=( (new DateTime(2000,1,1)).AddTicks(adduser.mg_time)).ToString(), //转成日期格式
                modify_time="",
                is_delete=false, 
                is_action=adduser.mg_state==1?"true":"false"

            };//返回数据对象
            rdata.meta.status = 201;//
            rdata.meta.msg = "增加用户成功";
            return rdata;
        }
        #endregion

        #region 1.3.3  修改用户的状态 配置自定义路由,注意该方法采用的自定义路由
        [Route("api/users/{uid}/state/{type}")]
        public ResponData Put(int uid, bool type)
        {
            //调用修改
            sp_manager sp_userobj = userdal.GetOne(uid);
            if (type == true)
            {
                sp_userobj.mg_state = 1;
            }
            else{
                sp_userobj.mg_state = 0;
            }
            int a= userdal.ModifyUser(sp_userobj);
            //构建返回类型对象
            ResponData rdata = new ResponData();
            rdata.data = new 
             {
                id = sp_userobj.mg_id,
                rid = sp_userobj.role_id, //角色id
                username = sp_userobj.mg_name,
                mobile = sp_userobj.mg_mobile,
                email = sp_userobj.mg_email,
                mg_state=sp_userobj.mg_state,//状态
            };
            rdata.meta.status=200;
            rdata.meta.msg = "设置状态成功";
            return rdata;
        }
        #endregion

        #region 1.3. 4 根据ID查询用户信息 id名与路径id一样，不需要改动
        public ResponData Get(int id)
        {

            //查询出数据
            sp_manager userobj = userdal.GetOne(id);
            //

            ResponData rdata = new ResponData();
            rdata.data = new
            {
                id = userobj.mg_id,
                username = userobj.mg_name,
                role_id=userobj.role_id,
                mobile = userobj.mg_mobile,
                email=userobj.mg_email
            };
            rdata.meta.status = 200;
            rdata.meta.msg = "查询一条成功";
            return rdata;
        }

        #endregion
        
        
        #region 1.3.5. 编辑用户提交
        public ResponData Put(int id,UpdateUserRequest userobj)
        {
            //先查询出要个修改的对象
            sp_manager Updateuserobj = userdal.GetOne(userobj.id);
            // 通过传过来的数据，修改要修改的其他项
            Updateuserobj.mg_email = userobj.email;
            Updateuserobj.mg_mobile = userobj.mobile;
             
            //调用修改
            int n= userdal.ModifyUser(Updateuserobj);
            //响应数据
            ResponData rdata = new ResponData();
            //修改后的对象信息返回
            rdata.data = new
            {
                id = Updateuserobj.mg_id,
                username = Updateuserobj.mg_name,
                role_id = Updateuserobj.role_id,
                mobile = Updateuserobj.mg_mobile,
                email = Updateuserobj.mg_email
            };
            rdata.meta.status = 200;//状态值
            rdata.meta.msg = "修改成功";
            return rdata;
        }

        #endregion


        #region 1.3.6. 删除单个用户
        public ResponData Delete(int id)
        {
            int n=userdal.DeleteOne(id);

            ResponData rdata = new ResponData();

            rdata.data = null;
            rdata.meta.status = 200;
            rdata.meta.msg = "删除成功";
            return rdata;
        }
        #endregion

        #region  1.3.7 分配用户角色 自定义路由 api为前缀要加上
        /// <summary>
        /// frombody如不成功，最好一个值也定义一个对象
        /// </summary>
        /// <param name="id"></param>
        /// <param name="rid">参数如果一个数，不是对象，可以用使用frombody约束</param>
        /// <returns></returns>
        [Route("api/users/{id}/role")]
        public ResponData Put(int id, [FromBody]dynamic rid)
        {
            ///////////////////
            //先查询出要个修改的对象
            sp_manager Updateuserobj = userdal.GetOne(id);
            //改角色
            Updateuserobj.role_id = (byte)rid; //短整形
            //调用修改方法
            userdal.ModifyUser(Updateuserobj);
            ///////////////////
            ResponData rd = new ResponData();
            rd.data = new
            {
                id = Updateuserobj.mg_id,
                username = Updateuserobj.mg_name,
                rid = Updateuserobj.role_id,
                mobile = Updateuserobj.mg_mobile,
                email = Updateuserobj.mg_email
            };
            rd.meta.msg = "设置角色成功";
            rd.meta.status = 200;
            return rd;
        }
        #endregion
    }

    /// <summary>
    /// 创建，增加用户时的，请求对象模型 用来接收请求过来的参数
    /// </summary>
    public class AddUserRequest
    {
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
    }

    /// <summary>
    /// 1.3.5 修改请求传过来的数据
    /// </summary>
    public class UpdateUserRequest
    {
        //标号
        public int id { get; set; }
        //邮箱
        public string email { get; set; }
        //手机号
        public string mobile { get; set; } 
    }
}
